# Структурный шаблон проектирования ("Заместитель")
# Позволяет подставлять вместо реальных объектов специальные объекты-заменители
# В данном примере применяется кэширование ранее полученных данных и тем самым снижается количество запросов к серверу


import abc
import typing


class ISite(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def get_page(self, num: int) -> None:
        pass


class Site(ISite):
    def get_page(self, num: int) -> str:
        return "Это страница {}". format(num)


class SiteProxy(ISite):
    def __init__(self, site: ISite):
        self.__site = site
        self.__cache: typing.Dict[int, str] = {}

    def get_page(self, num: int) -> str:
        page: str = ''
        if self.__cache.get(num) is not None:
            page = self.__cache[num]
            page = 'из кеша: ' + page
        else:
            page = self.__site.get_page(num)
            self.__cache[num] = page
        return page


if __name__ == "__main__":
    my_site: ISite = SiteProxy(Site())
    for page in range(10):
        print(my_site.get_page(page))

    # Это страница 0
    # Это страница 1
    # Это страница 2
    # Это страница 3
    # Это страница 4
    # Это страница 5
    # Это страница 6
    # Это страница 7
    # Это страница 8
    # Это страница 9
